const Koa = require('koa')
const app = new Koa()
const views = require('koa-views')
const json = require('koa-json')
const onerror = require('koa-onerror')
const bodyparser = require('koa-bodyparser')
const logger = require('koa-logger')
const session = require("koa-session");
const jwt = require("jsonwebtoken");
const koajwt = require("koa-jwt");
const index = require('./routes/index')
// const users = require('./routes/users')

const { SECRET, getToken, getJWTPayload } = require("./utils/token")

// error handler
onerror(app)

// middlewares
app.use(bodyparser({
  enableTypes: ['json', 'form', 'text']
}))
app.use(json())
app.use(logger())
app.use(require('koa-static')(__dirname + '/public'))

app.use(views(__dirname + '/views', {
  extension: 'pug'
}))

// logger
// const logger = require("./middlewares/mi-logger")
// app.use(logger)

// 跨域处理
const crossOrigin = require("./middlewares/mi-cross-origin");
app.use(crossOrigin);

// 通过中间件,把所有的工具关联起来，挂载到ctx上
const mysqlUtil = require("./middlewares/mi-mysqlUtil")
app.use(mysqlUtil)

// const Store = require("./utils/Store");
// const store = new Store();
// app.use(async (ctx, next) => {

//   if (ctx.request.url === "/login" || ctx.request.url === "/test") {
//     await next()
//   } else {
//     let redis_token = await store.get(ctx.header.authorization)
//     if (redis_token !== null) {
//       // 通过验证
//       await next()
//     } else {
//       // 验证失败
//       ctx.status = 401;
//       ctx.body = {
//         code: 401,
//         msg: "没有权限"
//       }
//     }
//   }
//   // await next()
// })



// koa-session
app.keys = ['some secret hurr'];
const CONFIG = {
  key: 'koa:sess',   //cookie key (default is koa:sess)
  maxAge: 86400000,  // cookie的过期时间 maxAge in ms (default is 1 days)
  overwrite: true,  //是否可以overwrite    (默认default true)
  httpOnly: true, //cookie是否只有服务器端可以访问 httpOnly or not (default true)
  signed: true,   //签名默认true
  rolling: false,  //在每次请求时强行设置cookie，这将重置cookie过期时间（默认：false）
  renew: false,  //(boolean) renew session when session is nearly expired,
};
app.use(session(CONFIG, app));

/**
 * 前端发送请求的时候，把token放到请求头上。
 * 如果这个token的密钥，等于koajwt第一个参数中的secret属性，那么就可以通过用户验证，
 * 否则返回401错误。
 */
// 路由权限控制：
// 注册，登录接口，其他资源不需要认证，信息接口需要认证
// const unlessPath = [/^\/login/, /^\/register/];
// const unlessPath = [/^\/login/, /^\/register/]
// app.use(koajwt({ secret: SECRET }).unless({
//   // 设置login,register接口，可以不需要认证访问
//   path: unlessPath
// }))

// 路由注册
app.use(index.routes(), index.allowedMethods())

// error-handling
app.on('error', (err, ctx) => {
  console.error('server error', err, ctx)
});

module.exports = app

// 全局路由拦截放在其他路由之前
// app.use(async (ctx, next) => {
//   return next().catch(err => {
//     // 自定义返回结果
//     if (err.status === 401) {
//       // 自定义返回结果
//       ctx.status = 401;
//       ctx.body = {
//         code: 401,
//         msg: err.message
//       }
//     } else {
//       throw err;
//     }
//   })
// })

// app.use(async (ctx, next) => {
//   if (unlessPath.indexOf(ctx.url) !== -1) {
//     await next()
//   } else {

//   }
// })

